package com.my.ruyi.ssl;

import java.net.InetAddress;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.group.ChannelGroup;
import io.netty.channel.group.DefaultChannelGroup;
import io.netty.handler.ssl.SslHandler;
import io.netty.util.concurrent.Future;
import io.netty.util.concurrent.GenericFutureListener;
import io.netty.util.concurrent.GlobalEventExecutor;

public class SslServerHandler extends SimpleChannelInboundHandler<String>{

	static final ChannelGroup channels = new DefaultChannelGroup(GlobalEventExecutor.INSTANCE);
	
	
	/**
	 * 通道激活时触发
	 */
	@Override
	public void channelActive(ChannelHandlerContext ctx) throws Exception {
		System.out.println("SslServerHandler-channelActive");
		// Once session is secured, send a greeting and register the channel to the global channel
        // list so the channel received the messages from others.
		ctx.pipeline().get(SslHandler.class).handshakeFuture()
			.addListener(new GenericFutureListener<Future<? super Channel>>() {
			@Override
			public void operationComplete(Future<? super Channel> future) throws Exception {
				ctx.writeAndFlush("Welcome to " + InetAddress.getLocalHost().getHostName() + " secure chat service!\n");
				
				ctx.writeAndFlush("your session is protected by " 
						+ ctx.pipeline().get(SslHandler.class).engine().getSession().getCipherSuite()
						+
                        " cipher suite.\n");
				
				channels.add(ctx.channel());
			}
		});
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
		System.out.println("SslServerHandler-exceptionCaught");
		cause.printStackTrace();
        ctx.close();
	}

	@Override
	protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
		System.out.println("SslServerHandler-channelRead0");
		// Send the received message to all channels but the current one.
		
		for(Channel channel : channels) {
			if (channel != ctx.channel()) {
				channel.writeAndFlush("[" + ctx.channel().remoteAddress() + "] " + msg + '\n');
			} else {
				channel.writeAndFlush("[you] " + msg + '\n');
			}
		}
		
		// Close the connection if the client has sent 'bye'.
        if ("bye".equals(msg.toLowerCase())) {
            ctx.close();
        }
	}
	

}
